/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ca.etsmtl.log660.ctrl;

import ca.etsmtl.log660.entity.Film;
import ca.etsmtl.log660.entity.Utilisateur;
import ca.etsmtl.log660.facade.FilmFacade;
import ca.etsmtl.log660.facade.LocationFacade;
import ca.etsmtl.log660.facade.UtilisateurFacade;
import ca.etsmtl.log660.view.ConnexionView;
import ca.etsmtl.log660.view.RechercheView;
import ca.etsmtl.log660.view.FilmDetailView;
import ca.etsmtl.log660.view.MainApplicationView;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultListModel;
import javax.swing.JPanel;

public class Controller {

    private MainApplicationView mainWindows;
    private ConnexionView  connexionView;
    private FilmDetailView filmDetailView;
    private RechercheView rechercheView;
   
    public Utilisateur loggedUser;
    
    //========================================================== constructor
    /** Constructor */
    public Controller(MainApplicationView mainWindows, ConnexionView connexionView, FilmDetailView filmDetailView, RechercheView rechercheView) {

        this.mainWindows = mainWindows;
        
        this.connexionView = connexionView;
        this.filmDetailView = filmDetailView;
        this.rechercheView = rechercheView;
 
        //... Add listeners to the view.
        this.connexionView.addConnexionListener(new ConnexionListener());
        this.rechercheView.addRechercheListener(new RechercheListener());
        this.rechercheView.addDetailsFilmListener(new DetailsFilmListener());
        this.filmDetailView.addDetailsActeurListener(new DetailsActeurListener());
        this.filmDetailView.addDetailsRealisateurListener(new DetailsRealisateurListener());
        this.filmDetailView.addLocationListener(new AddLocationListener());
        
        // Set the default view
        this.changeContentPanel(connexionView);
    }

    public void changeContentPanel(JPanel panel) {

        this.mainWindows.setContentPane(panel);
        panel.setVisible(true);
        
        this.mainWindows.repaint();
        this.connexionView.repaint();
        this.filmDetailView.repaint();
        this.rechercheView.repaint();
        
    }

    /** Listeners */
    class ConnexionListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {

             loggedUser = UtilisateurFacade.getInstance().
                     findUtilisateurByCourriel(connexionView.getJTextFieldCourriel());
             String password = connexionView.getJTextFieldPassword();

             if(!connexionView.getJTextFieldCourriel().equals("") &&
                !connexionView.getJTextFieldPassword().equals("")){

                 changeContentPanel(rechercheView);
             }
             else {

                 connexionView.setJTextFieldErreur("ERREUR: user ou mot de passe invalide");
             }
        }
    }

    class RechercheListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {

            List<String> titres;
            if(!rechercheView.getjTextFieldTitre().equals(""))
                titres = new ArrayList(Arrays.asList(rechercheView.getjTextFieldTitre().split(",")));
            else
                titres = new ArrayList();
            
            List<String> genres;
            if(!rechercheView.getjTextFieldGenre().equals(""))
                genres = new ArrayList(Arrays.asList(rechercheView.getjTextFieldGenre().split(",")));
            else
                genres = new ArrayList();
                        
            String anneeMin = rechercheView.getjTextFieldAnneMin();
            String anneeMax = rechercheView.getjTextFieldAnneMax();
            
            List<String> paysProd;
            if(!rechercheView.getjTextFieldPaysProd().equals(""))
                paysProd = new ArrayList(Arrays.asList(rechercheView.getjTextFieldPaysProd().split(",")));
            else
                paysProd = new ArrayList();
            
            List<String> langueOriginal;
            if(!rechercheView.getjTextFieldLangue().equals(""))
                langueOriginal = new ArrayList(Arrays.asList(rechercheView.getjTextFieldLangue().split(",")));
            else
                langueOriginal = new ArrayList();
        
            List<String> nomRealisateur;
            if(!rechercheView.getjTextFieldRealisateur().equals(""))
                nomRealisateur = new ArrayList(Arrays.asList(rechercheView.getjTextFieldRealisateur().split(",")));
            else
                nomRealisateur = new ArrayList();
            
            List<String> nomActeurs;
            if(!rechercheView.getjTextFieldActeur().equals(""))
                nomActeurs = new ArrayList(Arrays.asList(rechercheView.getjTextFieldActeur().split(",")));
            else
                nomActeurs = new ArrayList();
            
            List<Film> films = FilmFacade.getInstance().findFilmByCriteria(titres, genres, anneeMin, anneeMax, 
                                                                           paysProd, langueOriginal, nomRealisateur, nomActeurs);
            
            System.out.println("Nb of films found: "+films.size());
            
            DefaultListModel model = new DefaultListModel();
            rechercheView.getjListFilms().setModel(model);
            
            int pos = 0;
            for (Film film : films) {
                pos = rechercheView.getjListFilms().getModel().getSize();
                model.add(pos, film);
            }
        }
    }
    
    class DetailsFilmListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            
            if(rechercheView.getjListFilms().getSelectedIndex() != -1){
                try {
                    Film film = (Film) rechercheView.getjListFilms().getSelectedValue();
                    filmDetailView.setDetailFilm(film);
                    changeContentPanel(filmDetailView);
                } catch (SQLException ex) {
                    Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            else
                System.err.println("NEED TO SELECT A FILM!");
        }
    }
    
    class DetailsActeurListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            try {
                
                filmDetailView.setActeurDetails();
            } catch (SQLException ex) {
                Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
    class DetailsRealisateurListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            try {
                
                filmDetailView.setRealisateurDetails();
            } catch (SQLException ex) {
                Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
    class AddLocationListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            
           LocationFacade.getInstance().addLocation(loggedUser, filmDetailView.film);
           System.out.println("LOCATION EFFECTUEE!");
        }
    }
}